﻿using System;
using System.Web;
using System.Web.Http;
using System.Web.Http.Controllers;
using AuthorizeAttribute = System.Web.Http.AuthorizeAttribute;

namespace ContactMvc4TB.Helpers.RightsManagement
{
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
    public class CustomWebApiAuthorizeAttribute : AuthorizeAttribute
    {
        #region Member
        private HttpActionContext CurrentContext { get; set; }
        #endregion

        /// <summary>
        /// Prüfen ob der User auch Autorisiert ist, auf die passenden API Aufrufe zuzugreifen
        /// </summary>
        public override void OnAuthorization(HttpActionContext actionContext)
        {
            //Wenn der User nicht eingeloggt ist, dann wird er hier schon mit einem 401 abgewiesen
            base.OnAuthorization(actionContext);

            //Der Filtercontext wird benötigt um auf die RequestDaten zuzugreifen, z.b. auf die UserId die zugegriffen werden soll.
            CurrentContext = actionContext;
           

            //Wenn kein User eingeloggt ist, dann hat er auch keinen Zugriff.
            if (!HttpContext.Current.User.Identity.IsAuthenticated)
            {
                //Wenn der User nicht eingeloggt ist, auf die Loginseite verweisen
                HandleUnauthorizedRequest(actionContext);
            }
            else
            {
                //Prüfen der passenden Rechte für die einzelnen Actions/Methoden
                //Wenn der User nicht für den View/Action authentifiziert ist, dann auf die Loginseite verweisen.
                if (!CheckRights())
                {
                    HandleUnauthorizedRequest(actionContext);
                }
            }

            //Wenn alles i.o. ist "nichts" unternehmen und einfach beim Aufbau der Seite weitermachen.
        }

        /// <summary>
        /// Den unautorisierten Eingriff, "abwehren"
        /// </summary>
        /// <param name="actionContext"></param>
        protected override void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext)
        {
            var challengeMessage = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);
            throw new HttpResponseException(challengeMessage);
        }

        #region Private Functions
        /// <summary>
        /// Prüfen um welchen CurrentController es sich handelt und die passende Sicherheitsprüfung vornehmen
        /// Hier werden Nur API Controller überprüft
        /// </summary>
        /// <returns>TRUE->Darf zugreifen | FALSE->Darf nicht zugreifen</returns>
        private bool CheckRights()
        {
            //Setzen des aktuellen Actionnamen, der aufgerufen wird.
            string actionName = CurrentContext.ActionDescriptor.ActionName;
            //Laden des Controllernamens über den der API Aufruf kam
            string controllerName = CurrentContext.ControllerContext.ControllerDescriptor.ControllerName;
            //Auslesen der ID, wenn eine in der URL mit übergeben wurde.
            string id = CurrentContext.ControllerContext.RouteData.Values.ContainsKey("id") ?
                        CurrentContext.ControllerContext.RouteData.Values["id"].ToString() : null;

            //Den aktuellen User ermitteln der den API Aufruf gestartet hat.
            string username = HttpContext.Current.User.Identity.Name;

            //TODO Prüfung vornehmen ob der Aktuelle User auf die ermittelten Resourcen zugreifen darf.

            return true;
        }
        #endregion
    }
}


